單元測試是一種軟體測試方法,是指在開發過程中測試特定的程式碼 unit 或系統中的個別部分,以確保正確性。一個「單元 unit」是系統中所謂的最小可測試部分(通常是一個函數或方法),在多數情況下有一個明確定義的行為。
在Java中,我們通常使用 JUnit 框架來進行單元測試。而 Spring Boot Test Starter 是 Spring Boot 一個用來進行測試的 dependency。他把多個測試用的依賴整合到一個 Starter POM 中方便開發者使用。包含了 JUnit(依據使用 Spring Boot 版本不同有不同版本的 JUnit)、Spring Test、Mockito 等。
要使用 Spring Boot Test Starter 需要在 pom.xml
或 build.gradle
中加入以下依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
testImplementation 'org.springframework.boot:spring-boot-starter-test'
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest
public class ApplicationTest {
@Autowired
private Calculator calculator;
@Test
public void testAddition() {
int result = calculator.add(2, 3);
assertThat(result).isEqualTo(5);
}
}
@Component
class Calculator {
public int add(int a, int b) {
return a + b;
}
}
在這個例子中:
@SpringBootTest
註解來告訴 Spring Boot 載入整個應用上下文,這個過程會創建相關的 Beans 並自動配置。@Autowired
來注入 Calculator
Bean。@Test
註解來標記一個測試方法,注意 JUnit 4 與 5 import 的 package 不同。assertEquals
斷言
,用來確保測試結果與期望值相符。Calculator
類別包含我們想要測試的方法 add
。單元測試應該專注於小的功能點。每個測試應該只檢查「單個」功能或行為。當注意到撰寫測試變困難時,往往是重新檢視和調整程式碼的契機。
模組分解:單元測試覆蓋太多功能可能意味著被測試的函數或方法承擔過多責任,可以思考是否能拆分成多個單一職責的模組或函數。
依賴隔離:單元測試應該盡可能地去測試「單元」,如果程式碼與外部資源(例如資料庫或 Api )有過多的往來,可以考慮使用 Mock 或 Stub 來區隔這些依賴。
測試明確性:測試案例應該容易理解和維護。如果一個 test case 涵蓋過多情境或結構複雜,會變得難以理解和維護,因此確保測試目的和檢查點清楚明瞭是很重要的事情。
程式碼可測試性:如果測試難以撰寫,可能要思考如何改進程式碼的可測試性,例如通過依賴注入減少耦合,或酌用設計模式來改進程式碼結構。